home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / qtools0.2-src.lha / src / libqdisplay / draw-opti16.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-08-11  |  4.5 KB  |  178 lines

  1. #ifdef    USE_ZBUFFER
  2. #define    inc()        { u += du; v += dv; w += dw; }
  3. #define    fill(pel, z) { *pBuffer++ = (pel); *zBuffer++ = (unsigned short int)(z); }
  4. #else
  5. #define    inc()        { u += du; v += dv; }
  6. #define    fill(pel, z) { *pBuffer++ = (pel); }
  7. #endif
  8.  
  9. #ifdef    USE_ZBUFFER
  10. unsigned short int *draw_affine16(int n, unsigned short int *pBuffer, unsigned short int *zBuffer, int u, int v, int w, int du, int dv, int dw)
  11. #else
  12. unsigned short int *draw_affine16(int n, unsigned short int *pBuffer, int u, int v, int du, int dv)
  13. #endif
  14. {
  15.   if (textureType == WALL_TYPE) {
  16.     while (n--) {
  17.       int iu = u >> 16;
  18.       int iv = ((v >> (16 - MAX_LOGY)) & MAX_MASKX) + textureRow;
  19.  
  20. #ifdef CALCULATE_PIXELDRAW
  21.       pixelDraw++;
  22.       if (*pBuffer)
  23.     pixelOverdraw++;
  24. #endif
  25.  
  26.       fill(texture.hicolor[multMuls[iv] + iu], w);
  27.       inc();
  28.     }
  29.   }
  30.   else if (textureType == SKY_TYPE) {
  31.     /* TODO: skies */
  32.     while (n--) {
  33.       int iu;
  34.       int iv;
  35.       unsigned short int pel, sum;
  36.  
  37. #ifdef CALCULATE_PIXELDRAW
  38.       pixelDraw++;
  39.       if (*pBuffer)
  40.     pixelOverdraw++;
  41. #endif
  42.  
  43.       iu = ((u >> 8) + skyMovementX1) & 0x00007F00;
  44.       iv = ((v >> 16) + skyMovementY1) & 0x0000007F;
  45.       sum = texture.hicolor[iu + iv + 0x80];
  46.       iu = ((u >> 8) + skyMovementX2) & 0x00007F00;
  47.       iv = ((v >> 16) + skyMovementY2) & 0x0000007F;
  48.       if ((pel = texture.hicolor[iu + iv]))
  49.     sum = pel;
  50.  
  51.       fill(sum, 0xFFFF);
  52.       inc();
  53.     }
  54.   }
  55.   else {
  56.     while (n--) {
  57. #ifndef    FAST_WARP
  58.       int iv = ((v + (swim_v[((u >> textureShift2) & 0xff)] >> textureMip)) >> 16) & textureMask2;
  59.       int iu = ((u + (swim_u[((v >> textureShift2) & 0xff)] >> textureMip)) >> textureShift1) & textureMask1;
  60. #else
  61.       int iv = ((v + swim_v[(u >> 16)]) >> 16) & textureMask2;
  62.       int iu = ((u + swim_u[(v >> 16)]) >> textureShift1) & textureMask1;
  63. #endif
  64.  
  65.       fill(pretransp(texture.hicolor[iu + iv], *pBuffer), w);
  66.       inc();
  67.     }
  68.   }
  69.   return pBuffer;
  70. }
  71.  
  72. /* given a span (x0,y)..(x1,y), draw a perspective-correct span for it */
  73. /*
  74.  * the zbuffer is interesting for dynamic model-draw etc.
  75.  * the buffers values (1/z) are all under 0, we can try to
  76.  * store them as 16bit-wide-fraction
  77.  *
  78.  * while(n--) {
  79.  *   *zbuf++ = (unsigned short int)(w); / we need only the lower part /
  80.  *   w += dw;
  81.  * }
  82.  *
  83.  */
  84. void draw_spans16(int y, int ey)
  85. {
  86.   float prew = tmap[6] + y * tmap[8];
  87.   float prev = tmap[3] + y * tmap[5];
  88.   float preu = tmap[0] + y * tmap[2];
  89.  
  90.   for (; y < ey; y++) {
  91.     int sx = scan[y][0];
  92.     int len = scan[y][1] - sx;
  93.  
  94.     if (len > 0) {
  95.       float w0;
  96.       float v0;
  97.       float u0;
  98.  
  99. #ifdef    USE_ZBUFFER
  100.       int w, dw;                        /* 1/zbuffer */
  101. #endif
  102.       int v, dv;
  103.       int u, du;
  104.       int slen;
  105.  
  106.       unsigned short int *pBuffer = localDim.frameBuffer + multRows[y] + sx;
  107.  
  108. #ifdef    USE_ZBUFFER
  109.       unsigned short int *zBuffer = localDim.zBuffer + multRows[y] + sx;
  110. #endif
  111.  
  112.       /* compute (u,v) at left end */
  113.       w0 = 1 / (prew + sx * tmap[7]);                /* 1/zbuffer */
  114.       v0 = (prev + sx * tmap[4]) * w0;
  115.       u0 = (preu + sx * tmap[1]) * w0;
  116.  
  117. #ifdef    USE_ZBUFFER
  118.       w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  119. #endif
  120.       v = FLOAT_TO_FIX(v0);
  121.       u = FLOAT_TO_FIX(u0);
  122.  
  123.       for (slen = len >> SUBDIV_SHIFT; slen > 0; slen--) {
  124.     sx += SUBDIV;
  125.     w0 = 1 / (prew + sx * tmap[7]);
  126.     v0 = (prev + sx * tmap[4]) * w0;
  127.     u0 = (preu + sx * tmap[1]) * w0;
  128.  
  129. #ifdef    USE_ZBUFFER
  130.     dw = (FLOAT_TO_FIX(w0) - w) >> SUBDIV_SHIFT;        /* 1/zbuffer */
  131. #endif
  132.     dv = (FLOAT_TO_FIX(v0) - v) >> SUBDIV_SHIFT;
  133.     du = (FLOAT_TO_FIX(u0) - u) >> SUBDIV_SHIFT;
  134.  
  135. #ifdef    USE_ZBUFFER
  136.     pBuffer = draw_affine16(SUBDIV, pBuffer, zBuffer, u, v, w, du, dv, dw);
  137.     zBuffer += SUBDIV;
  138. #else
  139.     pBuffer = draw_affine16(SUBDIV, pBuffer, u, v, du, dv);
  140. #endif
  141.  
  142. #ifdef    USE_ZBUFFER
  143.     w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  144. #endif
  145.     v = FLOAT_TO_FIX(v0);
  146.     u = FLOAT_TO_FIX(u0);
  147.       }
  148.  
  149.       if ((slen = (len & SUBDIV_MASK) - 1)) {            /* a) do not calc if only draw 1 pixel */
  150.     float w1;
  151.     float v1;
  152.     float u1;
  153.  
  154.     sx += slen;
  155.     w1 = 1 / (prew + sx * tmap[7]);
  156.     v1 = (prev + sx * tmap[4]) * w1;
  157.     u1 = (preu + sx * tmap[1]) * w1;
  158.  
  159. #ifdef    USE_ZBUFFER
  160.     dw = FLOAT_TO_FIX((w1 - w0) / slen);            /* 1/zbuffer */
  161. #endif
  162.     dv = FLOAT_TO_FIX((v1 - v0) / slen);
  163.     du = FLOAT_TO_FIX((u1 - u0) / slen);
  164.       }
  165.       /* a) but draw that pixel surely */
  166. #ifdef    USE_ZBUFFER
  167.       draw_affine16(slen + 1, pBuffer, zBuffer, u, v, w, du, dv, dw);    /* for the last pixel the du and dv are thrown away */
  168. #else
  169.       draw_affine16(slen + 1, pBuffer, u, v, du, dv);        /* for the last pixel the du and dv are thrown away */
  170. #endif
  171.     }
  172.  
  173.     prew += tmap[8];
  174.     prev += tmap[5];
  175.     preu += tmap[2];
  176.   }
  177. }
  178.